package org.lanyu.springainovel.common.service;

import org.lanyu.springainovel.common.entity.TaskNotification;

import java.util.List;

/**
 * 任务通知服务接口 - 合并了异步任务和通知功能
 */
public interface TaskNotificationService {

    /**
     * 创建新任务
     * @param taskId 任务ID
     * @param userId 用户ID
     * @param taskType 任务类型
     * @param title 任务标题
     * @param content 任务内容
     * @return 创建的任务通知
     */
    TaskNotification createTask(String taskId, Long userId, String taskType, String title, String content);

    /**
     * 创建新通知
     * @param userId 用户ID
     * @param title 通知标题
     * @param content 通知内容
     * @param priority 优先级
     * @return 创建的通知
     */
    TaskNotification createNotification(Long userId, String title, String content, String priority);

    /**
     * 更新任务进度
     * @param taskId 任务ID
     * @param progress 进度百分比
     * @param statusMessage 状态消息
     * @return 是否更新成功
     */
    boolean updateTaskProgress(String taskId, int progress, String statusMessage);

    /**
     * 更新任务状态
     * @param taskId 任务ID
     * @param status 任务状态
     * @param message 状态消息
     * @return 是否更新成功
     */
    boolean updateTaskStatus(String taskId, String status, String message);

    /**
     * 完成任务
     * @param taskId 任务ID
     * @param result 任务结果
     * @return 是否更新成功
     */
    boolean completeTask(String taskId, String result);

    /**
     * 标记任务为失败
     * @param taskId 任务ID
     * @param errorMessage 错误信息
     * @return 是否更新成功
     */
    boolean failTask(String taskId, String errorMessage);

    /**
     * 取消任务
     * @param taskId 任务ID
     * @return 是否更新成功
     */
    boolean cancelTask(String taskId);

    /**
     * 根据用户ID获取未读通知数量
     * @param userId 用户ID
     * @return 未读通知数量
     */
    int getUnreadCount(Long userId);

    /**
     * 根据用户ID获取未读任务通知数量
     * @param userId 用户ID
     * @return 未读任务通知数量
     */
    int getUnreadTaskCount(Long userId);

    /**
     * 根据用户ID获取所有通知
     * @param userId 用户ID
     * @return 通知列表
     */
    List<TaskNotification> getAllByUserId(Long userId);

    /**
     * 根据用户ID获取未读通知
     * @param userId 用户ID
     * @return 未读通知列表
     */
    List<TaskNotification> getUnreadByUserId(Long userId);

    /**
     * 根据用户ID获取活动任务
     * @param userId 用户ID
     * @return 活动任务列表
     */
    List<TaskNotification> getActiveTasksByUserId(Long userId);

    /**
     * 根据用户ID获取已完成任务
     * @param userId 用户ID
     * @return 已完成任务列表
     */
    List<TaskNotification> getCompletedTasksByUserId(Long userId);

    /**
     * 根据任务ID获取任务通知
     * @param taskId 任务ID
     * @return 任务通知
     */
    TaskNotification getByTaskId(String taskId);

    /**
     * 根据用户ID和任务类型获取活动任务
     * @param userId 用户ID
     * @param taskType 任务类型
     * @return 活动任务列表
     */
    List<TaskNotification> getActiveTasksByUserIdAndType(Long userId, String taskType);

    /**
     * 标记通知为已读
     * @param id 通知ID
     * @return 是否更新成功
     */
    boolean markAsRead(Long id);

    /**
     * 标记用户所有通知为已读
     * @param userId 用户ID
     * @return 是否更新成功
     */
    boolean markAllAsRead(Long userId);

    /**
     * 删除已读的任务通知
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteReadTasks(Long userId);

    /**
     * 删除已读的通知
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteReadNotifications(Long userId);

    /**
     * 删除指定天数前的已完成任务
     * @param userId 用户ID
     * @param days 天数
     * @return 是否删除成功
     */
    boolean deleteOldCompletedTasks(Long userId, int days);

    /**
     * 根据ID获取任务通知
     * @param id 通知ID
     * @return 任务通知
     */
    TaskNotification getById(Long id);

    /**
     * 删除通知
     * @param id 通知ID
     * @return 是否删除成功
     */
    boolean deleteById(Long id);
}